<?xml version="1.0" ?>

<xs:schema targetNamespace="http://www.dotnetguru.org/AspectDNG" 
	xmlns:adng="http://www.dotnetguru.org/AspectDNG"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	elementFormDefault="qualified"
	attributeFormDefault="unqualified">
		
    <xs:complexType name="PointcutType">
		<xs:attribute name="targetXPath" type="xs:string" />
		<xs:attribute name="targetRegExp" type="xs:string" />
	</xs:complexType>

	<xs:complexType name="AdviceType">
		<xs:attribute name="targetXPath" type="xs:string" />
		<xs:attribute name="targetRegExp" type="xs:string" />
		<xs:attribute name="aspectXPath" type="xs:string" />
		<xs:attribute name="aspectRegExp" type="xs:string" />
	</xs:complexType>
	
    <xs:element name="Advice">	
        <xs:complexType>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="Delete" type="adng:PointcutType"/>            
                <xs:element name="Insert" type="adng:AdviceType"/>
                
                <xs:element name="Warning" type="adng:PointcutType"/>            
                <xs:element name="Error" type="adng:PointcutType"/>            


                <xs:element name="InlineBeforeConstructorCall" type="adng:AdviceType"/>
                <xs:element name="InlineAfterConstructorCall" type="adng:AdviceType"/>
                
                <xs:element name="InlineBeforeMethodCall" type="adng:AdviceType"/>
                <xs:element name="InlineAfterMethodCall" type="adng:AdviceType"/>
                
                <xs:element name="InlineBeforeInstruction" type="adng:AdviceType"/>
                <xs:element name="InlineAfterInstruction" type="adng:AdviceType"/>
                
                <xs:element name="InlineBeforeFieldReadAccess" type="adng:AdviceType"/>
                <xs:element name="InlineAfterFieldReadAccess" type="adng:AdviceType"/>
                
                <xs:element name="InlineAfterFieldWriteAccess" type="adng:AdviceType"/>
                <xs:element name="InlineBeforeFieldWriteAccess" type="adng:AdviceType"/>
                
                <xs:element name="InlineAtStart" type="adng:AdviceType"/>
                <xs:element name="InlineBeforeReturn" type="adng:AdviceType"/>
                
                <xs:element name="AroundCall" type="adng:AdviceType"/>
                <xs:element name="AroundBody" type="adng:AdviceType"/>
                
                <xs:element name="GenericAroundCall" type="adng:AdviceType"/>
                <xs:element name="GenericAroundBody" type="adng:AdviceType"/>
                <xs:element name="GenericAroundFieldWrite" type="adng:AdviceType"/>
                <xs:element name="GenericAroundFieldRead" type="adng:AdviceType"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>

	<xs:element name="AspectDngConfig">	
		<xs:complexType>
			<xs:sequence minOccurs="1" maxOccurs="1">
				
                <xs:element name="BaseAssembly" type="xs:string"/>
				
                <xs:element name="AspectsAssembly" type="xs:string"/>				

				<xs:element name="PrivateLocations">
					<xs:complexType>
						<xs:sequence minOccurs="0" maxOccurs="unbounded">
							<xs:element name="PrivatePath" type="xs:string"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>

				<xs:element ref="adng:Advice"/>
                
				<xs:element name="AdviceFiles">
					<xs:complexType>
						<xs:sequence minOccurs="0" maxOccurs="unbounded">
							<xs:element name="AdviceFile" type="xs:string"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>

				<xs:element name="XsltTransformers">
					<xs:complexType>
						<xs:sequence minOccurs="0" maxOccurs="unbounded">
							<xs:element name="XsltTransformer" type="xs:string"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
                
			</xs:sequence>
			<xs:attribute name="debug" type="xs:boolean"/>
			<xs:attribute name="logIlml" type="xs:boolean"/>
			<xs:attribute name="logIlmlPath" type="xs:string"/>			
			<xs:attribute name="logWeaving" type="xs:boolean"/>
			<xs:attribute name="logWeavingPath" type="xs:string"/>			
			<xs:attribute name="logWarnings" type="xs:boolean"/>
			<xs:attribute name="logWarningsPath" type="xs:string"/>			
		</xs:complexType>
	</xs:element>
    
</xs:schema>